package gra;

import GUI.Controler;

/**
 * Klasa konta gracza.
 * Zadania: przechowywanie danych gracza,usuwanie kart.
 */
public class Account 
{
    public Card[] hand = new Card[5];//Deklaracja tablicy gracza z jego kartami.
    public int rank=-1;//Rank gracza
    public int najwyzsza = 0;//Najwyzsza karta
    public int Mpoker=-1;//Najwyzsza pokera
    public int Mczworka=-1;//Najwyzsza czworki
    public int Mful =-1; //Najwyzsza fula
    public int Mtrojka=-1;//Najwyzsza trojki
    public int Mkolor=-1;//Najwyzsza koloru
    public int Mstrit=-1;//Najwyzsza strita
    public int Mpara1=-1;//Najwyzsza pary
    public int Mpara2=-1;//Druga najwyzsza karta pary
    public int Kicker=-1;//Karta Kicker
    public int cash = 0;//Stan konta gracza
    public int war=0;//Wartosc o ktora gracz chce zmienic zaklad
    public int id = 0;//Numer identyfikacyjny gracza
    public int betSum =0;//Suma wszytkich zakladow
    public int bet = 0;//Suma zakladu w danej rundzie
    public int lastBet =0;//Suma ostatniego zakladu
    public int lastAction = 0;//Ostatnia akcja gracza
    public boolean active = true;//Czy gracz ma mozliwosc dalszej gry
    public Player owner;//Wlasciciel konta
    public int wygrana = 0;//Ilosc wygranych
    public int przegrana = 0;//Ilosc przegranych
    
    //proba
    //public Controler kontrolerGry;
    
    /**
     * Konstruktor klasy
     * @param gracz Gracz
     * @param cash Poczatkowy stan konta
     * @param id Numer indentyfikacyjny konta
     */
    public Account( Player gracz,int cash,int id)
    {
        this.cash = cash;
        this.id = id;
        owner = gracz;
    }
    
    /**
     * Metoda zwracajaca rank gracza
     * 
     * @return  Rank gracza.
     */
    public int getRank()//Zwraca rank gracza.
    {
        int temp=0;
        temp += rank;
        return temp;
    }
    
    /**
     * Metoda zwracajaca kopie kart z hand.
     * 
     * @return  Kopia kart z hand.
     */
    public Card[] getCards()//Zwraca kopie kart z hand.
    {
        Card[] temp = new Card[5];
        
        for( int i = 0; i < 5; i++ )
        {
            int value  = hand[i].value;
            int colour = hand[i].colour;
            try
            {
                temp[i] = new Card( value, colour );
            }
            catch(IllegalArgumentException e )
            {
                System.out.println("Blad inicjalizacji klasy Card.");
            }
        }
        
        return temp;
    }
    
    /**
     * Metoda usuwajaca karty z reki gracza.
     */
    public void delete( int tab[] )//Usuwa karty z reki.
    {
        if( tab.length != 0 )
        {
            for( int i : tab )
            {
                for( int j = 0; j < 5; j++ )
                {
                    if( i == j ) hand[j] = null;
                }
            }
        }
    }
    

    public String figuraGracza( )
    {
        switch( rank )
        {
            case 1 :
            {
                return "Poker";
            }
            case 2 :
            {
                return "Kareta";
            }
            case 3 :
            {
                return "Full";
            }
            case 4 :
            {
                return "Kolor";
            }
            case 5 :
            {
                return "Strit";
            }
            case 6 :
            {
                return "Trojka";
            }
            case 7 :
            {
                return "Dwie pary";
            }
            case 8 :
            {
                return "Para";
            }
            case 9 :
            {
                return "Najwyzsza karta";
            }
            default:
            {
                return "brak";
            }
        }
    }
    
    /**
     * Ustawia aktywnosc gracza w grze/
     * @param active Aktywnosc
     */
    public void setActive(boolean active)
    {
        this.active = active;
    }
    
    /**
     * Wykonuje operacje na stanie konta gracza
     * @param in O jaka wartosc ma zmienic stan konta gracza
     */
    public void deal(int in)
    {
        this.cash+=in;
    }
    
    /**
     * Operacja licytacji na koncie gracza
     * @param jackpot Pula nagrod
     * @param MaxBet Najwieksza aktualna stawka 
     * @param opcje Opcje jakie ma do dyspozycji gracz w czasie licytacji
     */
    public void bid(int jackpot,int MaxBet,boolean opcje[], Licytator licytator )
    {
        lastBet = bet;
        int i=-1;
        int dane[] = new int[2]; //Dane
        int a = jackpot;
        int b = MaxBet;
        int c = cash;
        int l = lastBet;
        int r = rank;
        boolean opcje2[] = new boolean[6];
        for(int m=0;m<6;m++)
            opcje2[m]=opcje[m];
        war=0;
        
        if( owner.czyBot() )
        {
            dane = owner.bid(a,b,c,opcje2,l,r, licytator);
            i = dane[0]; //Jaka operacje chce wykonac gracz.
            war = dane[1]; //Wartosc operacyjna gracza.
            if(i==1) bet = war;
            if(i==2) bet = MaxBet + war;
            if(i==3) bet = MaxBet;
            if(i==5) bet = lastBet + cash;
            lastAction = i;
        }
        else
        {
            licytator.wywolajLicytacje( this, id );
        }
    }
    
    public void bidHuman( int MaxBet, Licytator licytator )
    {
        int i;
        int[] dane = new int[2];
        dane = licytator.zwrocWprowadzoneDane();
        
        i = dane[0]; //Jaka operacje chce wykonac gracz.
        war = dane[1]; //Wartosc operacyjna gracza.
        if(i==1) bet = war;
        if(i==2) bet = MaxBet + war;
        if(i==3) bet = MaxBet;
        if(i==5) bet = lastBet + cash;
        lastAction = i;
    }
    
    
    
}
